El objetivo de este trabajo es analizar a través de tablas y gráficos los perfiles (edad y sexo) de las personas que más están involucradas en accidentes de tráfico y visualizar a través de un mapa la localización de los accidentes que han causado la muerte de las víctimas. Los datos los descargamos de la págína del ayuntamiento de Barcelona de los años 2016 y 2017 e involucran dos archivos CSV: Personas involucradas y Vehículos.
Importamos los archivos ccvs de personas involucradas y vemos las primeras 5 líneas. En el caso de las coordenadas, al importarlas de forma standard se eliminaban los decimales, es por esto que tuvimos que cambiar la , por . y luego convertir el campo en numerico.
install.packages("readr")
Error in install.packages : Updating loaded packages
library(readr)
delim = ","
dec = ","
personas2016 <- read.csv("2016_accidents_persones_gu_bcn.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE)
class(personas2016$Coordenada_UTM_.X.)
[1] "character"
options(digits=10)
personas2016$Coordenada_UTM_.X. <- (gsub(",", ".", as.character(personas2016$Coordenada_UTM_.X.)))
personas2016$Coordenada_UTM_.X. <- as.numeric(personas2016$Coordenada_UTM_.X.)
personas2016$Coordenada_UTM_.Y. <- (gsub(",", ".", as.character(personas2016$Coordenada_UTM_.Y.)))
personas2016$Coordenada_UTM_.Y. <- as.numeric(personas2016$Coordenada_UTM_.Y.)
head(personas2016)
personas2017<- read.csv("2017_accidents_persones_gu_bcn_.csv", header= TRUE, sep=",")
head(personas2017)
class(personas2017$Coordenada_UTM_.X.)
[1] "factor"
options(digits=10)
personas2017$Coordenada_UTM_.X.<- (gsub(",", ".", as.character(personas2017$Coordenada_UTM_.X.)))
personas2017$Coordenada_UTM_.X. <- as.numeric(personas2017$Coordenada_UTM_.X.)
personas2017$Coordenada_UTM_.Y. <- (gsub(",", ".", as.character(personas2017$Coordenada_UTM_.Y.)))
personas2017$Coordenada_UTM_.Y. <- as.numeric(personas2017$Coordenada_UTM_.Y.)
head(personas2017)
Estudiamos la estructura y dimensión de los dos DataFrames.
dim(personas2016)
[1] 12072 28
dim(personas2017)
[1] 12148 28
str(personas2016)
'data.frame': 12072 obs. of 28 variables:
$ Número_d.expedient : chr "2016S000001 " "2016S000002 " "2016S000003 " "2016S000004 " ...
$ Codi_districte : int 2 1 8 2 2 2 8 7 5 8 ...
$ Nom.districte : chr "Eixample" "Ciutat Vella" "Nou Barris" "Eixample" ...
$ Codi_barri : int 7 3 53 8 8 8 56 35 27 48 ...
$ Nom_barri : chr "la Dreta de l'Eixample" "la Barceloneta" "la Trinitat Nova" "l'Antiga Esquerra de l'Eixample" ...
$ Codi_carrer : int 144601 194202 209900 32700 32700 32700 269902 310008 279600 75101 ...
$ Nom.carrer : chr "Diagonal" "Mar" "Meridiana" "Balmes" ...
$ Num_postal. : chr "0361B0361B" "0022 0022" "0595X0595X" "0119 0119" ...
$ Descripció_dia_setmana : chr "Divendres" "Divendres" "Divendres" "Divendres" ...
$ Dia.setmana : chr "Dv" "Dv" "Dv" "Dv" ...
$ Descripció.tipus.dia : chr "Laboral" "Laboral" "Laboral" "Laboral" ...
$ NK.Any : int 2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
$ Mes.de.any : int 1 1 1 1 1 1 1 1 1 1 ...
$ Nom.mes : chr "Gener" "Gener" "Gener" "Gener" ...
$ Dia.de.mes : int 1 1 1 1 1 1 1 1 1 1 ...
$ Descripció.torn : chr "Nit" "Nit" "Nit" "Matí" ...
$ Hora.de.dia : int 0 2 5 6 6 6 8 9 16 14 ...
$ Descripció.causa.vianant : chr "No és causa del vianant" "No és causa del vianant" "No és causa del vianant" "No és causa del vianant" ...
$ Desc._Tipus_vehicle_implicat: chr "Taxi" "Motocicleta" "Motocicleta" "Turismo" ...
$ Descripció_sexe : chr "Home" "Home" "Home" "Dona" ...
$ Edat : chr "41" "19" "24" "29" ...
$ Descripció_tipus_persona : chr "Conductor" "Passatger" "Conductor" "Vianant" ...
$ Descripció_situació : chr "Presentado" "Desconegut" "Presentado" "Desconegut" ...
$ Descripció_victimització : chr "Ferit lleu" "Ferit lleu" "Ferit lleu" "Ferit lleu" ...
$ Coordenada_UTM_.X. : num 430142 432161 432262 429716 429716 ...
$ Coordenada_UTM_.Y. : num 4583396 4581526 4589064 4582880 4582880 ...
$ Long : num 2.16 2.19 2.19 2.16 2.16 ...
$ Lat : num 41.4 41.4 41.4 41.4 41.4 ...
str(personas2017)
'data.frame': 12148 obs. of 28 variables:
$ Número_d.expedient : Factor w/ 9433 levels "2017S000001 ",..: 1 2 3 4 4 5 6 6 7 8 ...
$ Codi_districte : int 5 2 2 10 10 1 2 2 3 9 ...
$ Nom.districte : Factor w/ 11 levels "Ciutat Vella",..: 11 3 3 9 9 1 3 3 10 8 ...
$ Codi_barri : int 26 5 6 66 66 1 7 7 18 62 ...
$ Nom_barri : Factor w/ 74 levels "Baró de Viver",..: 62 18 41 20 20 24 32 32 66 17 ...
$ Codi_carrer : int 187105 197302 89004 243206 243206 352100 191204 191204 270209 133300 ...
$ Nom.carrer : Factor w/ 1401 levels "","A Zona Franca",..: 755 802 356 970 970 1345 769 769 1070 550 ...
$ Num_postal. : Factor w/ 2004 levels "","0 ",..: 597 836 1756 717 717 65 1310 1310 372 37 ...
$ Descripció_dia_setmana : Factor w/ 7 levels "Dijous","Dilluns",..: 6 6 6 6 6 6 6 6 6 6 ...
$ Dia.setmana : Factor w/ 7 levels "Dc","Dg","Dj",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Descripció.tipus.dia : Factor w/ 1 level "Laboral": 1 1 1 1 1 1 1 1 1 1 ...
$ NK.Any : int 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 ...
$ Mes.de.any : int 1 1 1 1 1 1 1 1 1 1 ...
$ Nom.mes : Factor w/ 12 levels "Abril","Agost",..: 5 5 5 5 5 5 5 5 5 5 ...
$ Dia.de.mes : int 1 1 1 1 1 1 1 1 1 1 ...
$ Descripció.torn : Factor w/ 3 levels "Matí","Nit","Tarda": 2 2 1 1 1 1 1 1 3 1 ...
$ Hora.de.dia : int 4 2 7 7 7 11 10 10 14 12 ...
$ Descripció.causa.vianant : Factor w/ 6 levels "Altres","Creuar per fora pas de vianants",..: 5 5 5 5 5 5 5 5 5 5 ...
$ Desc._Tipus_vehicle_implicat: Factor w/ 31 levels "Altres vehicles amb motor",..: 31 19 19 13 13 8 19 19 13 3 ...
$ Descripció_sexe : Factor w/ 3 levels "Desconegut","Dona",..: 3 3 2 2 3 3 2 3 2 2 ...
$ Edat : Factor w/ 100 levels "0","1","10","11",..: 48 44 22 37 33 60 27 31 31 93 ...
$ Descripció_tipus_persona : Factor w/ 3 levels "Conductor","Passatger",..: 1 1 1 2 1 3 2 1 1 2 ...
$ Descripció_situació : Factor w/ 6 levels "Altres","Citado",..: 5 5 5 4 5 4 4 5 5 4 ...
$ Descripció_victimització : Factor w/ 8 levels "Ferit greu","Ferit greu: hospitalització superior a 24h",..: 3 3 3 3 3 3 3 3 3 3 ...
$ Coordenada_UTM_.X. : num 428887 431987 431616 432467 432467 ...
$ Coordenada_UTM_.Y. : num 4583659 4583283 4583972 4583327 4583327 ...
$ Long : Factor w/ 6444 levels "'","2.095684",..: 1900 5245 4900 5645 5645 3530 3351 3351 1190 4847 ...
$ Lat : Factor w/ 6386 levels "'","41.322371",..: 3368 2947 3747 2999 2999 1408 2711 2711 991 5291 ...
Juntamos en un unico DataFrame las victimas de 2016 y 2017.
victimas <- rbind(personas2016, personas2017)
Verificamos que se mantengan la estructura y dimensión original.
head(victimas) == head(personas2016)
Número_d.expedient Codi_districte Nom.districte Codi_barri Nom_barri Codi_carrer Nom.carrer Num_postal.
1 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
2 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
4 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
5 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
6 TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Descripció_dia_setmana Dia.setmana Descripció.tipus.dia NK.Any Mes.de.any Nom.mes Dia.de.mes
1 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
2 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
4 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
5 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
6 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Descripció.torn Hora.de.dia Descripció.causa.vianant Desc._Tipus_vehicle_implicat Descripció_sexe Edat
1 TRUE TRUE TRUE TRUE TRUE TRUE
2 TRUE TRUE TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE TRUE TRUE
4 TRUE TRUE TRUE TRUE TRUE TRUE
5 TRUE TRUE TRUE TRUE TRUE TRUE
6 TRUE TRUE TRUE TRUE TRUE TRUE
Descripció_tipus_persona Descripció_situació Descripció_victimització Coordenada_UTM_.X.
1 TRUE TRUE TRUE TRUE
2 TRUE TRUE TRUE TRUE
3 TRUE TRUE TRUE TRUE
4 TRUE TRUE TRUE TRUE
5 TRUE TRUE TRUE TRUE
6 TRUE TRUE TRUE TRUE
Coordenada_UTM_.Y. Long Lat
1 TRUE TRUE TRUE
2 TRUE TRUE TRUE
3 TRUE TRUE TRUE
4 TRUE TRUE TRUE
5 TRUE TRUE TRUE
6 TRUE TRUE TRUE
tail(victimas) == tail(personas2017)
Número_d.expedient Codi_districte Nom.districte Codi_barri Nom_barri Codi_carrer Nom.carrer
24215 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24216 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24217 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24218 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24219 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24220 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Num_postal. Descripció_dia_setmana Dia.setmana Descripció.tipus.dia NK.Any Mes.de.any Nom.mes
24215 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24216 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24217 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24218 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24219 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
24220 TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Dia.de.mes Descripció.torn Hora.de.dia Descripció.causa.vianant Desc._Tipus_vehicle_implicat
24215 TRUE TRUE TRUE TRUE TRUE
24216 TRUE TRUE TRUE TRUE TRUE
24217 TRUE TRUE TRUE TRUE TRUE
24218 TRUE TRUE TRUE TRUE TRUE
24219 TRUE TRUE TRUE TRUE TRUE
24220 TRUE TRUE TRUE TRUE TRUE
Descripció_sexe Edat Descripció_tipus_persona Descripció_situació Descripció_victimització
24215 TRUE TRUE TRUE TRUE TRUE
24216 TRUE TRUE TRUE TRUE TRUE
24217 TRUE TRUE TRUE TRUE TRUE
24218 TRUE TRUE TRUE TRUE TRUE
24219 TRUE TRUE TRUE TRUE TRUE
24220 TRUE TRUE TRUE TRUE TRUE
Coordenada_UTM_.X. Coordenada_UTM_.Y. Long Lat
24215 TRUE TRUE TRUE TRUE
24216 TRUE TRUE TRUE TRUE
24217 TRUE TRUE TRUE TRUE
24218 TRUE TRUE TRUE TRUE
24219 TRUE TRUE TRUE TRUE
24220 TRUE TRUE TRUE TRUE
dim(victimas)[1] == dim(personas2016)[1] + dim(personas2017)[1]
[1] TRUE
(dim(victimas)[2] == dim(personas2016)[2]) & (dim(victimas)[2] == dim(personas2017)[2])
[1] TRUE
Creamos un DataFrame con las columnas que utilizaremos durante nuestra analisis.
filtro_victimas <- c("Número_d.expedient", 'Nom.districte', 'Descripció_dia_setmana',
'NK.Any', 'Mes.de.any', 'Dia.de.mes',
'Descripció.torn', 'Descripció_sexe', 'Edat',
'Descripció_tipus_persona', 'Descripció_victimització',
"Coordenada_UTM_.X.", "Coordenada_UTM_.Y.")
victimas <- victimas[filtro_victimas]
head(victimas)
Cambiamos los nombres de las columnas.
names(victimas) <- c('NumExpediente', 'Distrito', 'DiaSemana', 'Ano', 'Mes', 'Dia','Horario', 'Sexo', 'Edad', 'TipoPersona', 'TriajeVictima', 'C_UTM_X', 'C_UTM_Y')
head(victimas)
Vamos a repetir las mismas operaciones con las bases de datos de vehiculos. Para este trabajo vamos a tomar en cuenta el Modelo del vehiculo, la tipología de carnet del conductor y la antiguedad del carnet.
vehiculos2016<- read.csv("2016_accidents_vehicles_gu_bcn_.csv")
head(vehiculos2016)
vehiculos2017<- read.csv("2017_accidents_vehicles_gu_bcn_.csv")
head(vehiculos2017)
dim(vehiculos2016)
[1] 19410 27
dim(vehiculos2017)
[1] 19795 27
str(vehiculos2016)
'data.frame': 19410 obs. of 27 variables:
$ Codi.d.expedient : Factor w/ 10139 levels "","2016S000001 ",..: 4656 8623 8623 9868 9868 2187 2187 4034 4034 7966 ...
$ Codi.districte : int 5 5 5 5 5 5 5 5 5 5 ...
$ Nom.districte : Factor w/ 11 levels "Ciutat Vella",..: 11 11 11 11 11 11 11 11 11 11 ...
$ Codi.barri : int 22 22 22 22 22 22 22 22 22 22 ...
$ Nom.barri : Factor w/ 74 levels "Baró de Viver",..: 72 72 72 72 72 72 72 72 72 72 ...
$ Codi.carrer : int 700053 202050 202050 700059 700059 221928 221928 700059 700059 700059 ...
$ Nom.carrer : Factor w/ 1142 levels "A / Número 3 ",..: 669 650 650 1097 1097 912 912 1097 1097 1097 ...
$ Num.postal.caption : Factor w/ 2001 levels "","0","0000 0000",..: 144 16 16 437 437 166 166 94 94 1938 ...
$ Descripció.dia.setmana : Factor w/ 7 levels "Dijous","Dilluns",..: 4 1 1 4 4 5 5 1 1 1 ...
$ Dia.setmana : Factor w/ 7 levels "Dc","Dg","Dj",..: 1 3 3 1 1 6 6 3 3 3 ...
$ Descripció.tipus.dia : Factor w/ 1 level "Laboral": 1 1 1 1 1 1 1 1 1 1 ...
$ NK.Any : int 2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
$ Mes.de.any : int 6 11 11 12 12 3 3 5 5 10 ...
$ Nom.mes : Factor w/ 12 levels "Abril","Agost",..: 7 10 10 3 3 9 9 8 8 11 ...
$ Dia.de.mes : int 15 10 10 21 21 19 19 26 26 20 ...
$ Hora.de.dia : int 11 19 19 18 18 7 7 7 7 7 ...
$ Descripció.causa.vianant : Factor w/ 6 levels "Altres","Creuar per fora pas de vianants",..: 5 5 5 5 5 5 5 5 5 2 ...
$ Descripció.tipus.de.vehicle: Factor w/ 22 levels "","Autobús","Autobús articulado",..: 8 22 22 16 22 7 16 16 22 22 ...
$ Descripció.model : Factor w/ 1310 levels ""," ","@125",..: 86 161 691 402 507 1062 414 1007 350 165 ...
$ Descripció.marca : Factor w/ 155 levels "","AIYUMO","ALEXANDER DENNIS",..: 116 7 80 57 132 66 140 57 116 57 ...
$ Descripció.color : Factor w/ 19 levels "","Altres","Beige",..: 4 4 2 12 4 4 12 5 4 5 ...
$ Descripció.carnet : Factor w/ 19 levels "","A","A1","A2",..: 9 6 6 2 6 9 4 2 6 6 ...
$ Antiguitat.carnet : Factor w/ 78 levels "","-2","-46",..: 11 12 71 77 23 14 65 11 18 48 ...
$ Coordenada.UTM..X. : Factor w/ 6397 levels "423606,83","424249,09",..: 1 2 2 3 3 4 4 5 5 6 ...
$ Coordenada.UTM..Y. : Factor w/ 6403 levels "4575151,17","4575187,41",..: 5627 5506 5506 5516 5516 5167 5167 5271 5271 5247 ...
$ Longitud : num 2.08 2.09 2.09 2.09 2.09 ...
$ Latitut : num 41.4 41.4 41.4 41.4 41.4 ...
str(vehiculos2017)
'data.frame': 19795 obs. of 27 variables:
$ Codi_expedient : Factor w/ 10305 levels "2017S000001 ",..: 1 2 2 3 4 4 5 5 5 6 ...
$ Codi_districte : int 5 2 2 7 2 2 10 10 10 1 ...
$ Nom_districte : Factor w/ 11 levels "Ciutat Vella",..: 11 3 3 5 3 3 9 9 9 1 ...
$ Codi_barri : int 26 5 5 33 6 6 66 66 66 1 ...
$ Nom_barri : Factor w/ 74 levels "Baró de Viver",..: 62 18 18 8 41 41 20 20 20 24 ...
$ Codi_carrer : int 187105 197302 197302 265402 89004 89004 243206 243206 243206 352100 ...
$ Nom_carrer : Factor w/ 1676 levels "A Zona Franca",..: 882 935 935 1251 421 421 1139 1139 1139 1516 ...
$ Num_postal. : Factor w/ 2076 levels "","0 ",..: 624 872 872 3 1818 1818 750 750 750 69 ...
$ Descripcio_dia_setmana : Factor w/ 7 levels "Dijous","Dilluns",..: 6 6 6 6 6 6 6 6 6 6 ...
$ Dia_setmana : Factor w/ 7 levels "Dc","Dg","Dj",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Descripcio_tipus_dia : Factor w/ 1 level "Laboral": 1 1 1 1 1 1 1 1 1 1 ...
$ NK_Any : int 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 ...
$ Mes_de_any : int 1 1 1 1 1 1 1 1 1 1 ...
$ Nom_mes : Factor w/ 12 levels "Abril","Agost",..: 5 5 5 5 5 5 5 5 5 5 ...
$ Dia_de_mes : int 1 1 1 1 1 1 1 1 1 1 ...
$ Hora_de_dia : int 4 2 2 6 7 7 7 7 7 11 ...
$ Descripcio_causa_vianant : Factor w/ 6 levels "Altres","Creuar per fora pas de vianants",..: 5 5 5 5 5 5 5 5 5 5 ...
$ Descripcio_tipus_de_vehicle: Factor w/ 33 levels "Altres vehicles amb motor",..: 33 21 33 33 21 33 13 33 33 8 ...
$ Descripcio_model : Factor w/ 1763 levels " ","---","@125",..: 1146 618 1000 167 257 679 1179 65 1028 570 ...
$ Descripcio_marca : Factor w/ 185 levels "A U D I","A.U.D.I.",..: 119 76 137 24 96 60 96 115 137 23 ...
$ Descripcio_color : Factor w/ 18 levels "Altres","Beige",..: 8 11 8 4 11 8 11 8 4 17 ...
$ Descripcio_carnet : Factor w/ 20 levels "A","A1","A2",..: 5 1 12 5 5 5 19 5 12 12 ...
$ Antiguitat_carnet : Factor w/ 71 levels "-189","-46","0",..: 17 28 71 26 48 59 70 15 71 71 ...
$ Coordenada_UTM_.X. : Factor w/ 7224 levels "","-1","423500,71",..: 2103 5863 5863 3686 5489 5489 6327 6327 6327 3904 ...
$ Coordenada_UTM_.Y. : Factor w/ 7234 levels "","-1","4575106,49",..: 3811 3276 3276 5477 4216 4216 3350 3350 3350 1573 ...
$ Longitud : Factor w/ 6968 levels "-1.489619","'",..: 2063 5668 5668 3540 5291 5291 6105 6105 6105 3791 ...
$ Latitud : Factor w/ 6892 levels "-0.001532","'",..: 3607 3165 3165 5180 4017 4017 3217 3217 3217 1532 ...
filtro_vehiculos2016 <- c("Codi.d.expedient", 'Descripció.tipus.de.vehicle', 'Descripció.carnet',
'Antiguitat.carnet')
vehiculos2016 <- vehiculos2016[filtro_vehiculos2016]
head(vehiculos2016)
filtro_vehiculos2017 <- c("Codi_expedient", 'Descripcio_tipus_de_vehicle', 'Descripcio_carnet',
'Antiguitat_carnet')
vehiculos2017 <- vehiculos2017[filtro_vehiculos2017]
head(vehiculos2017)
names(vehiculos2016) <- c('NumExpediente', 'Modelo', 'Carnet', 'Antig_carnet')
names(vehiculos2017) <- c('NumExpediente', 'Modelo', 'Carnet', 'Antig_carnet')
vehiculos <- rbind(vehiculos2016, vehiculos2017)
head(vehiculos)
dim(vehiculos)[1] == dim(vehiculos2016)[1] + dim(vehiculos2017)[1]
[1] TRUE
(dim(vehiculos)[2] == dim(vehiculos2016)[2]) & (dim(vehiculos)[2] == dim(vehiculos2017)[2])
[1] TRUE
Ahora limpiamos los datos.
Vamos a estudiar los Modelos de vehículos para revisar que no existan errores de tipeo o que un mismo Modelo este escrito de maneras distintas.
class(vehiculos$Modelo)
[1] "factor"
Como está en factor lo tengo que convertir en character.
vehiculos$Modelo<-as.character(vehiculos$Modelo)
Quiero saber todos los nombres distintos que aparecen en el campo “Modelo”.
unique(vehiculos$Modelo)
[1] "Camión > 3,5 Tm" "Turismo" "Motocicleta"
[4] "Camión <= 3,5 Tm" "Bicicleta" "Taxi"
[7] "Furgoneta" "Ciclomotor" "Autobús"
[10] "Todo terreno" "Autocar" "Tranvía o tren"
[13] "Tractocamión" "Maquinaria de obras" "Otros vehíc. a motor"
[16] "Carro" "Autobús articulado" "Cuadriciclo <75cc"
[19] "Autocaravana" "Microbus <=17 plazas" "Cuadriciclo >=75cc"
[22] "" "Turisme" "Camió rígid <= 3,5 tones"
[25] "Autobús articulat" "Camió rígid > 3,5 tones" "Tractor camió"
[28] "Altres vehicles sense motor" "Altres vehicles amb motor" "Maquinària d'obres i serveis"
[31] "Tren o tramvia" "Tot terreny" "Quadricicle > 75 cc"
[34] "Quadricicle < 75 cc" "Desconegut" "Microbus <= 17"
Aquí podemos observar que hay variables que se repiten porque están escritas de maneras distintas como por ejemplo Cuadriciclo >=75cc = Quadricicle > 75 cc y Turisme = Turismo Por lo que debo normalizar la información.
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Carro", "Turismo", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Turisme", "Turismo", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Quadricicle > 75 cc", "Cuadriciclo >=75cc", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Tot terreny", "Todo terreno", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Quadricicle < 75 cc", "Cuadriciclo <75cc", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Tractor camió", "Tractocamión", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Microbus <= 17", "Microbus <=17 plazas", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Altres vehicles amb motor", "Otros vehíc. a motor", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Maquinària d'obres i serveis", "Maquinaria de obras", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Camió rígid <= 3,5 tones", "Camión <= 3,5 Tm", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Camió rígid > 3,5 tones", "Camión > 3,5 Tm", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Tren o tramvia", "Tranvía o tren", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Autobús articulat", "Autobús articulado", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "Autocar", "Autobús", vehiculos$Modelo)
vehiculos$Modelo<-ifelse(vehiculos$Modelo == "", "Desconegut", vehiculos$Modelo)
Comprobamos.
unique(vehiculos$Modelo)
[1] "Camión > 3,5 Tm" "Turismo" "Motocicleta"
[4] "Camión <= 3,5 Tm" "Bicicleta" "Taxi"
[7] "Furgoneta" "Ciclomotor" "Autobús"
[10] "Todo terreno" "Tranvía o tren" "Tractocamión"
[13] "Maquinaria de obras" "Otros vehíc. a motor" "Autobús articulado"
[16] "Cuadriciclo <75cc" "Autocaravana" "Microbus <=17 plazas"
[19] "Cuadriciclo >=75cc" "Desconegut" "Altres vehicles sense motor"
Ahora revisamos los tipos de carnet.
class(vehiculos$Carnet)
[1] "factor"
Como está en factor, lo debo convertir en character.
vehiculos$Carnet<-as.character(vehiculos$Carnet)
Quiero saber todos los nombres distintos que aparecen en el campo “Carnet”.
unique(vehiculos$Carnet)
[1] "C" "B" "A" "A2" "Desconegut" "BTP"
[7] "A1" "AM" "D" "E C" "E D" "Llicència"
[13] "B1" "D1" "C1" "E B" "E C1" ""
[19] "E D1" "Es desconeix" "Sense permís"
Los tipos de carnet de conducir que existen en España son: AM, A1, A2, A, B1, B, C1, C, D1, D, BE, C1E, CE, D1E, DE y BTP (ya está descontinuado). Además que hay personas que conducen sin permiso o son las victimas. Tomamos como Licencia a aquellas personas que conducen con permisos extranjeros y esta variable tiene un error de tipeo. También “Desconegut” = “Es desconeix”. Normalizamos esta información.
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "E C", "CE", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "Es desconeix", "Desconegut", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "Llicència", "licencia", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "E D", "DE", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "E C1", "C1E", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "E B", "BE", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "E D1", "D1E", vehiculos$Carnet)
vehiculos$Carnet<-ifelse(vehiculos$Carnet == "", "Desconegut", vehiculos$Carnet)
Comprobamos.
unique(vehiculos$Carnet)
[1] "C" "B" "A" "A2" "Desconegut" "BTP"
[7] "A1" "AM" "D" "CE" "DE" "licencia"
[13] "B1" "D1" "C1" "BE" "C1E" "D1E"
[19] "Sense permís"
Realizamos el mismo proceso para verificar la antiguedad de los carnets. Como la antiguedad del carnet no puede ser negativa ni mayor a 100, decimos que es un error a la hora de tomar los datos y lo agrupamos en desconocidos. Pero primero es necesario convertirlo en numerico.
class(vehiculos$Antig_carnet)
[1] "factor"
vehiculos$Antig_carnet<-as.numeric(as.character(vehiculos$Antig_carnet))
NAs introduced by coercion
unique(vehiculos$Antig_carnet)
[1] 11 12 66 9 21 14 6 18 44 NA 10 0 26 25 7 20 3 22 8 2
[21] 41 4 17 54 24 32 5 15 34 31 29 1 19 33 55 23 46 13 27 52
[41] 30 47 16 39 43 38 35 40 53 36 62 37 64 56 -2 45 28 60 42 48
[61] 51 58 73 49 50 -5 59 -47 57 61 63 1818 -46 -484 67 68 -972 69 -189 71
Limpiamos los datos.
vehiculos$Antig_carnet<-ifelse(vehiculos$Antig_carnet == 0, 0, vehiculos$Antig_carnet)
vehiculos$Antig_carnet<-ifelse(vehiculos$Antig_carnet < 0, NA, vehiculos$Antig_carnet)
vehiculos$Antig_carnet<-ifelse(vehiculos$Antig_carnet > 100, NA, vehiculos$Antig_carnet)
Comprobamos.
unique(vehiculos$Antig_carnet)
[1] 11 12 66 9 21 14 6 18 44 NA 10 0 26 25 7 20 3 22 8 2 41 4 17 54 24 32 5 15 34 31 29 1 19 33
[35] 55 23 46 13 27 52 30 47 16 39 43 38 35 40 53 36 62 37 64 56 45 28 60 42 48 51 58 73 49 50 59 57 61 63
[69] 67 68 69 71
Procedemos a revisar los distritos y a transformarlos en character.
victimas$Distrito<-as.character(victimas$Distrito)
unique(victimas$Distrito)
[1] "Eixample" "Ciutat Vella" "Nou Barris" "Horta-Guinardó"
[5] "Sarrià-Sant Gervasi" "Sant Martí" "Sant Andreu" "Gràcia"
[9] "Sants-Montjuïc" "Les Corts" "Desconegut"
En el caso de los distritos no hay nada que modificar.
Revisamos los días de semana.
class(victimas$DiaSemana)
[1] "character"
unique(victimas$DiaSemana)
[1] "Divendres" "Dissabte" "Diumenge" "Dilluns" "Dimecres" "Dimarts" "Dijous"
Tampoco hay nada que transformar en esta columna.
Revisamos que solamente tengamos como año 2016 y 2017 y verificamos que sea numerico.
unique(victimas$Ano)
[1] 2016 2017
class(victimas$Ano)
[1] "integer"
Revisamos que el campo de día de semana tenga sólo valores de 1 a 31 y verificamos que efectivamente sea numerico.
unique(victimas$Dia)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
class(victimas$Dia)
[1] "integer"
Ahora revisamos que el campo de mes tenga sólo valores de 1 a 12 y que sea numerico.
unique(victimas$Mes)
[1] 1 2 3 4 6 5 9 7 8 10 11 12
class(victimas$Mes)
[1] "integer"
Procedemos a revisar el horario, que se refiere a si ocurrió en la mañana, tarde o noche.
unique(victimas$Horario)
[1] "Nit" "Matí" "Tarda"
Revisamos el sexo para verificar que no haya ningun error de tipeo.
unique(victimas$Sexo)
[1] "Home" "Dona" "Desconegut"
Comprobamos el tipo las edades de las victimas.
class(victimas$Edad)
[1] "character"
Hay que transformarlo en numerico.
victimas$Edad<-as.integer(victimas$Edad)
NAs introduced by coercion
Vemos las edades de las personas involucradas.
unique(victimas$Edad)
[1] 41 19 24 29 36 45 68 22 37 27 1 32 9 28 20 21 86 18 23 46 47 79 42 4 7
[26] 60 26 50 31 44 25 48 30 15 49 78 38 54 53 52 11 51 33 65 90 63 61 62 57 40
[51] 43 77 NA 39 5 56 74 34 81 64 58 35 17 55 12 59 66 0 72 16 70 71 67 3 2
[76] 8 80 83 75 76 84 10 73 87 69 13 6 14 82 92 85 89 88 96 94 93 91 119 98 117
[101] 97 95
Tomamos como error las edades mayores a 112 años (que es la persona más vieja de España) y las agrupamos en los desconocidos.
victimas$Edad= ifelse(victimas$Edad > 112, NA, victimas$Edad)
Comprobamos.
unique(victimas$Edad)
[1] 41 19 24 29 36 45 68 22 37 27 1 32 9 28 20 21 86 18 23 46 47 79 42 4 7 60 26 50 31 44 25 48 30
[34] 15 49 78 38 54 53 52 11 51 33 65 90 63 61 62 57 40 43 77 NA 39 5 56 74 34 81 64 58 35 17 55 12 59
[67] 66 0 72 16 70 71 67 3 2 8 80 83 75 76 84 10 73 87 69 13 6 14 82 92 85 89 88 96 94 93 91 98 97
[100] 95
Revisamos el tipo de persona que se refiere al papel de la victima, es decir, si era el conductor, el pasajero, peaton, etc.
unique(victimas$TipoPersona)
[1] "Conductor" "Passatger" "Vianant"
El triaje se refiere a la gravedad del herido.
unique(victimas$TriajeVictima)
[1] "Ferit lleu"
[2] "Ferit greu"
[3] "Mort"
[4] "Ferit lleu: Hospitalització fins a 24h"
[5] "Ferit greu: hospitalització superior a 24h"
[6] "Ferit lleu: Amb assistència sanitària en lloc d'accident"
[7] "Ferit lleu: Rebutja assistència sanitària"
[8] "Mort (dins 24h posteriors accident)"
Para el analisis agrupamos en leve, grave y muerto.
victimas$TriajeVictima<-ifelse(victimas$TriajeVictima == "Ferit lleu: Hospitalització fins a 24h", "Ferit lleu", victimas$TriajeVictima)
victimas$TriajeVictima<-ifelse(victimas$TriajeVictima == "Ferit lleu: Amb assistència sanitària en lloc d'accident", "Ferit lleu", victimas$TriajeVictima)
victimas$TriajeVictima<-ifelse(victimas$TriajeVictima == "Ferit lleu: Rebutja assistència sanitària", "Ferit lleu", victimas$TriajeVictima)
victimas$TriajeVictima<-ifelse(victimas$TriajeVictima == "Ferit greu: hospitalització superior a 24h", "Ferit greu", victimas$TriajeVictima)
install.packages("readr")
trying URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.5/readr_1.3.1.tgz'
Content type 'application/x-gzip' length 777189 bytes (758 KB)
==================================================
downloaded 758 KB
The downloaded binary packages are in
/var/folders/dv/s9xmq08d7xj0n3xdzcyv3g8h0000gn/T//RtmpRmBKvi/downloaded_packages
victimas$TriajeVictima<-ifelse(victimas$TriajeVictima == "Mort (dins 24h posteriors accident)", "Mort", victimas$TriajeVictima)
Comprobamos.
unique(victimas$TriajeVictima)
[1] "Ferit lleu" "Ferit greu" "Mort"
Ya tenemos los datos limpios por lo que procedemos a interpretarlos.
Primero instalamos ggplot2 y llamamos a la libreria.
install.packages("ggplot2")
Error in install.packages : Updating loaded packages
library(ggplot2)
Ahora graficamos un histograma con la cantidad de victimas según la edad utilizando en el eje x la escala de 5 años.
ggplot(data=victimas, aes(victimas$Edad)) +
geom_histogram(breaks=seq(0, 100, by = 5),
col="red",
aes(fill=..count..)) +
scale_fill_gradient("Número victimas", low = "green", high = "red") +
labs(title="Histograma número de victimas por edad") +
labs(x="Edad", y="Cantidad")
En este histograma podemos ver una representación gráfica de la cantidad de victimas según la edad. El histograma incluye a su vez un mapa de calor que permite una visualización más rápida. Se puede observar que la mayoria de las victimas se concentran en la edad de 20 a 30 años.
Ahora veremos las estadísticas principales de la edad:
summary(victimas$Edad)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.0000 26.0000 36.0000 38.3065 48.0000 98.0000 174
La edad mínima de las victimas es de 0, lo que puede implicar que hay niños menores a 1 año involucrados y la edad promedio es de 38 años.
A continuación realizamos un histograma de la cantidad de accidentes según la antiguedad del carnet. Para ello se utiliza en el eje x la escala de 5 años
ggplot(data=vehiculos, aes(vehiculos$Antig_carnet)) +
geom_histogram(breaks=seq(0, 70, by = 5),
col="blue",
aes(fill=..count..)) +
scale_fill_gradient("Número victimas", low = "green", high = "darkblue") +
labs(title="Histograma número de victimas por antiguedad de carnet") +
labs(x="Antiguedad", y="Cantidad")
En este histograma podemos observar como disminuye el número de accidentes al crecer de la antiguedad del carnet de conducir.
Vemos las estadisticas principales de la antiguedad de carnet.
summary(vehiculos$Antig_carnet)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.00000 6.00000 13.00000 16.91014 26.00000 73.00000 4841
Ahora instalamos el paquete de Tidyverse para poder utilizar la libreria de dplyr que nos permite analizar y manipular datos en un DataFrame
install.packages("tidyverse")
trying URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.5/tidyverse_1.2.1.tgz'
Content type 'application/x-gzip' length 88754 bytes (86 KB)
==================================================
downloaded 86 KB
The downloaded binary packages are in
/var/folders/dv/s9xmq08d7xj0n3xdzcyv3g8h0000gn/T//RtmpRmBKvi/downloaded_packages
library(dplyr)
Agrupamos por día de semana y graficamos para ver la tendencia.
PorDia<- victimas %>%
group_by(DiaSemana) %>%
summarize(Total=n())%>%
arrange(desc(Total))
PorDia
positions<- c("Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte", "Diumenge" )
ggplot(data.frame(victimas), aes(x=victimas$DiaSemana)) +
scale_x_discrete(limits= positions, labels=c("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"))+
geom_bar()+
labs(title="Histograma número de victimas por día de la semana") +
labs(x="Dias de semana", y="Cantidad")
Con el gráfico anterior podemos observar que los accidentes tienen una tendencia creciente los días de semana, teniendo un pico los días viernes y que estos disminuyen considerablemente los fines de semana, en especial el domingo.
Ahora vamos a graficar los horarios.
pos<- c("Matí", "Tarda", "Nit")
ggplot(data.frame(victimas), aes(x=victimas$Horario)) +
scale_x_discrete(limits= pos, labels=c("Mañana", "Tarde", "Noche"))+
geom_bar()+
labs(title="Histograma número de victimas por horario") +
labs(x="Horario", y="Cantidad")
Podemos observar que la mayoría de los accidentes ocurren por la tarde.
Agrupamos los tipos de carnet y por vehiculos.
TipoCarnet<- vehiculos %>%
group_by(Carnet) %>%
summarize(Total=n())%>%
arrange(desc(Total))
TipoCarnet
TipoVehiculo<- vehiculos %>%
group_by(Modelo) %>%
summarize(Total=n())%>%
arrange(desc(Total))
TipoVehiculo
Graficamos para ver la cantidad de accidentes por barrio.
ggplot(data.frame(victimas), aes(x=victimas$Distrito)) +
geom_bar(col= "blue" ,fill="blue")+
labs(title="Histograma número de victimas por distrito") +
labs(x="Distrito", y="Cantidad")
El distrito con mayor cantidad de accidentes es el Eixample o en castellano, el Ensanche, que es el tiene mayor cantidad de accidentes. Cabe destacar que es el distrito más poblado de Barcelona en terminos relativos y absolutos.
Creamos una tabla para ver la cantidad de accidentes según el día de semana y el horario y lo graficamos en un mapa de calor.
nueva<-victimas %>%
group_by(DiaSemana, Horario) %>%
summarize(Total=n())
positions<- c("Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte", "Diumenge")
nueva$Horario <- factor(nueva$Horario, levels = c("Matí", "Tarda", "Nit"), labels=c("Mañana", "Tarde", "Noche"))
ggplot(nueva, aes(x = nueva$DiaSemana, y = nueva$Horario, fill = nueva$Total)) + scale_x_discrete(limits= positions, labels=c("Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo")) + geom_tile() +
scale_fill_gradient(low = "white", high = "steelblue")+
labs(x = "Día Semana", y = "Horario", fill = "Número Accidentes", title = "Mapa de calor número de victimas por día de la semana y horario")
Este gráfico nos permite observar que los días con más accidentes son los viernes por la tarde.
Nota: para diseñar un punto en un mapa con la libreria cartociudad, hace falta conocer su latitud y longitud. Por este trabajo, decidimos utilizar sólo las bases de datos de 2016 y 2017, que ya contienen los datos de latitud y longitud a parte de las coordenadas UTM, entonces este procedimiento resulta redondante. Decidimos seguir este camino porque las bases de datos de los años anteriores sólo contienen las coordenadas UTM y entonces nos pareció interesante encontrar una solución a este problema.
Creamos un nuevo DataFrame eliminando del DataFrame original las filas con coordenadas nulas o <0.
victimas_sin_coord_nulas <- victimas[(!is.na(victimas$C_UTM_X) & !is.na(victimas$C_UTM_Y) & victimas$C_UTM_X>0 & victimas$C_UTM_Y>0), ]
victimas_sin_coord_nulas[(is.na(victimas_sin_coord_nulas$C_UTM_X) | is.na(victimas_sin_coord_nulas$C_UTM_Y) | victimas_sin_coord_nulas$C_UTM_X<0 | victimas_sin_coord_nulas$C_UTM_Y<0), ]
head(victimas_sin_coord_nulas)
Instalamos los paquetes necesarios y trasformamos las coordenadas UTM en latitud y longitud.
install.packages("sp")
Error in install.packages : Updating loaded packages
library(sp) # vector data
install.packages("raster")
Error in install.packages : Updating loaded packages
library(raster) # raster data
install.packages("rgdal")
Error in install.packages : Updating loaded packages
library(rgdal) # input/output, projections
install.packages("rgeos")
Error in install.packages : Updating loaded packages
library(rgeos) # geometry ops
utmcoor<-SpatialPoints(victimas_sin_coord_nulas[, c("C_UTM_X", "C_UTM_Y")], proj4string=CRS("+proj=utm +zone=31"))
longlatcoor<-spTransform(utmcoor,CRS("+proj=longlat"))
head(longlatcoor)
class : SpatialPoints
features : 1
extent : 2.164305145, 2.164305145, 41.39906949, 41.39906949 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +ellps=WGS84
Añadimos los campos de latitud y longitud al DataFrame. Nos damos cuenta que hay un error en los valores de las coordenadas UTM que genera un deslizamiento de los puntos en el mapa. Afortunadamente, para arreglar este error es suficiente restar a latitud y longitud unos valores fijos.
victimas_sin_coord_nulas$Long <- longlatcoor$C_UTM_X-0.001103145
victimas_sin_coord_nulas$Lat <- longlatcoor$C_UTM_Y-0.00184649
head(victimas_sin_coord_nulas)
Diseñamos en el mapa todos los puntos donde se haya tenido victimas de accidentes durante los años 2016 y 2017.
install.packages("devtools")
Error in install.packages : Updating loaded packages
library(devtools)
install_github("rOpenSpain/caRtociudad")
Skipping install of 'caRtociudad' from a github remote, the SHA1 (a3509700) has not changed since last install.
Use `force = TRUE` to force installation
library(caRtociudad)
install.packages("ggmap")
Error in install.packages : Updating loaded packages
library(ggmap)
bcn <- cartociudad_geocode("barcelona")
mapa_bcn <- cartociudad_get_map(c(bcn$lat, bcn$lng), 2)
mapa <- ggmap::ggmap(mapa_bcn)
mapa + geom_point(aes(x = Long, y = Lat), data = victimas_sin_coord_nulas, size = 1)